7#EE)8aaaa kL6xae *  ------------------------------------------------------ | COMPLETE EXPLANATION OF THE DARK FORCES INF FILE | | by Jereth Kok (kokj4m@stmichaels.vic.edu.au) | ------------------------------------------------------ Acknowledgements: ----------------- LucasArts Entertainment Company -- creators of Dark Forces Yves Borckmans -- creator of DFUSE, some additional information Ben & Pat McBride -- makers of the DFUSE tutorials Anyone else who I haven't mentioned and believe that they have made a significant contribution to the world of Dark Forces editing! G'day, fellow Dark Forces editors! This file (INFFILE.TXT) gives an explanation of most of the functions of the .INF file, which is an essential part of a true Dark Forces level. The SECBASE level which is included contains demonstrations of elevators and triggers, which are some of the .INF file's functions. Remeber to put the SECBASE.* files in your Dark directory! Take a look at SECBASE.INF, to see the examples, then play the level to see how they work. I assume that anyone reading this file or using the demo already has managed to obtain Yves Borckman's DFUSE program. You will need LEVMAP, a .LEV and .O file editor which is a part of DFUSE. However, although LEVMAP reads the .INF file, it does not edit it. This must be done with a standard text file editor, such as MS-DOS editor. This is extremely complicated, and any slight error will stuff up a level. Believe me, it took me ages to figure out the basic workings of the .INF file! I had to look through all of the examples in LucasArt's original 14 levels! I don't really want every single person to go through that, so I made this file and the demo. Ben and Pat McBride gave you a simple example of using the INF file, showing how to make a moving floor. This file is for die-hard level makers, showing the usage of just about everything that can be in an INF file (anything I've come across in my wanderings through the INF files of the original levels). I've tried to make it as un-technical as possible! CONTENTS -------- 1. INF file description 2. Variables for elevators and triggers 3. Elevators 4. Triggers 5. Teleporter chutes 6. Messages 7. Other stuff 1. INF (INFormation) file description ------------------------------------- To those of you who have edited DOOM maps before, the INF file is like DOOM's sector tags and line actions, only much more powerful. Variables are used so that item actions can be specified customly, rather than just using set actions such as "platform lowers, then raises to nearest floor". To those of you who haven't done DOOM editing, here is the best I can do to describe the INF file: The LEV file, as you should know, contains information on the architecture of a level, ie. Sectors, Lines and Vertices. However, the INF file contains dymanimcs of a level, i.e. Sectors and Lines that move around and interact with the player. For example, the LEV file would contain a stationary room. The INF file could make a lift that goes up and down and a switch that operates it. Here follows a description of each elevator (moving sector), trigger and message, so get a coke and bag of chips and get comfortable... 2. VARIABLES FOR ELEVATORS AND TRIGGERS --------------------------------------- Firstly, the possible variables for elevators and triggers must be understood. Note that all of these variables may not be used in every elevator or trigger. That is, a particular elevator or trigger may only contain a few of these variables. The variables: --------------------------------------- | stop (elevators) | | master (elevators) | | event_mask (elevators/triggers) | | event (triggers) | | entity_mask (triggers, I think!) | | speed (elevators) | | center (elevators) | | angle (elevators) | | key (elevators) | | client (triggers) | | slave (elevators) | --------------------------------------- Here are descriptions and explanations on the usage of each of the variables. Anything in square brackets - [ ] - need to be replaced with appropriate values. stop ---- description: A stop is a value that an elevator can arrive at. This value varies depending on the type of elevator (eg. the value for elevator move_floor is the altitude of the floor). After the stop value, there needs to be another value. This other value can either be the time the elevator remains at the stop in seconds, "hold", "terminate" or "complete". Hold means that the elevator will remain at the stop until told to move to another stop. Terminate means that the elevator will terminate at the stop (it will stay there permanently). Complete means that the mission will be complete when the elevator arrives at the stop. usage: stop: [value] [time]/hold/terminate/complete master ------ description: A master value can either be on or off. If master is on, the elevator will function. If master is off, the elevator won't function, even if the event_mask (more on this later!) is carried out or a message (more on this later too) is sent, telling it to move. usage: master: on/off event_mask ---------- description: Event_mask is a value which determines under what conditions an elevator or trigger will function. For an elevator, the conditions will move it to its next stop. For a trigger, the conditions determine how it can be triggered. These are the possible values: --------------------------------------------------------------------- | 0 Nothing | | 1 Cross line from front side | | 2 Cross line from back side | | 4 Enter sector | | 8 Leave sector | | 16 Nudge line from front side / Nudge sector from inside | | 32 Nudge line from back side / Nudge sector from outside | | 64 Explosion | | 256 Shoot at line (see entity_mask) | | 512 Touch floor of sector | | | | Custom values (see event:) Set off by a trigger with an event: | | --------------------------------------------------------------------- If you want a sector or line to have more than one of these values, then add the desired values up. For example, an elevator that can be operated by entering the sector or nudging in from inside has event_mask: 20 (16 + 4). usage: event_mask: [value] event ----- description: Event creates a custom event value. A trigger can be given a custom event value, and any elevator with this event value as its event_mask value will operate when the trigger is triggered. The custom event value has to be a power of 2 that is 65536 or greater (65536, 131072, 262144, 524288, 1048576 and so on). This is needed with multi-class elevators where each class is controlled by a separate switch. For example in the Research Facility (level 4), the sector called "Corecat" (spins around the Phrik metal) is two classes of elevator - elevator move_fc and elevator morph_spin2. Two switches control these classes individually. If the "event" variable was not used, both switches would move both classes of elevator to its next stop at the same time. Utilising the "event" variable, it is made possible to have one switch control spinning and one control the moving floor/ceiling. usage: event: [value] entity_mask ----------- Entity_mask defines the entity that triggers certain triggers. The default is the player. Here are the values that are used in the original 14 levels. ----------------------------------------------------------------------------- | -1 unknown, see IMPCITY.INF. Used with event_mask: 308 Seems to| | work the same as * | | 1 an enemy (eg. an enemy crossing a line trigger) | | 8 one of your weapons (eg. a "shoot" switch) | | * usually used with event_mask: 272 - you can shoot at the | | trigger and nudge it | | 2147483656 unknown, see the DTENTION.INF, RAMSHED.INF and ARC.INF. | | Usually used with event_mask: 304. Seems to work the| | same way as * | |---------------------------------------------------------------------------- **Could anyone who has figured out the unknown values please mail me at the address at the top of this file and tell me them??? ** Entity_mask is always used in triggers except in the Research Facility (level 4), where it is applied to an elevator (the big one that spins around the Phrik metal and moves up and down). I don't know its function here. Removing the entity_mask from its sequence does not affect the elevator's workings! Any explanations??? usage: entity_mask: [value] speed ----- description: Speed is a value that determines the speed of an elevator. Speed: 0 is instantaneous. usage: speed: [value] center ------ description: Center defines the X and Z coordinates of the center of revolution of a spinning sector. usage: center: [x coord] [z coord] angle ----- description: Angle defines the angle in degrees of a scrolling wall, floor or ceiling texture. Angle also defines the angle in degrees of a horizontally moving sector. For scrolling walls, angle: 0 is down. For scrolling walls, scrolling ceilings and moving sectors, angle: 0 is north. usage: angle: 0-360 key --- description: The value of key defines which key is needed to operate an elevator. Key is optional, of course. Just leave it out if you don't want your elevator to need a key to operate. usage: key: red/blue/yellow client ------ description: Client is used with triggers only. It defines which sector the trigger affects. usage: client: [client sector name] slave ----- description: Slave is optional and is used with elevators only. Slave determines which sector is a slave of the elevator it is applied to. The slave copies whatever the elevator does. usage: slave: [slave sector name] 3. ELEVATORS ------------ Here are the elevators: ---------------------------------- | elevator change_light | | elevator change_wall_light | | elevator morph_move1 | | elevator morph_move2 | | elevator morph_spin1 | | elevator morph_spin2 | | elevator elevator rotate_wall | | elevator door | | elevator door_mid | | elevator basic | | elevator inv | | elevator move_ceiling | | elevator move_floor | | elevator move_fc | | elevator scroll_ceiling | | elevator scroll_floor | | elevator scroll_wall | ---------------------------------- All elevators will comprise of this: item: sector name: [sector name] seq seqend Classes of elevators and relevant variable information are placed between the "seq" and "seqend". You can put more than one class between the "seq" and "seqend" to create a sector that is two or more types of elevator. Here is a description of each elevator class and how to use it. The variables that are needed for each class are shown. Any variables in {} are optional. Note that anything in square brackets - [] - must be replaced with appropriate values. There can always be an unlimited amount of stops (except for elevator door and elevator door_mid which don't use stops). The stop values for each type of elevator are explained. IMPORTANT: Each time you add an elevator to the INF file, you must update the "items #" at the start of the INF file. elevator change_light --------------------- description: changing light level (ambience) in sector. Stop values are sector ambience. usage: class: elevator change_light event_mask: {master: } stop: speed: {slave: } elevator change_wall_light -------------------------- description: changing ambience on wall. Note that you apply this elevator to a whole sector, but make specific walls change light by giving those walls flag 1 bit 8 (allow change wall light) in Levmap. Walls without this flag will not change ambience even if their sector is an elevator change_wall_light. Stops values are wall ambience. usage: class: elevator change_wall_light event_mask: {master: } stop: speed: {slave: } elevator morph_move1 -------------------- description: A sector that moves horizontally. The player doesn't move with the sector. IMPORTANT - each of the moving sector's walls, as well as any mirrors of those walls need to be given the flag 1 bit 32 (wall morph with sector). Otherwise, the sector would not move visually. Stop values are distances on the X-Z (horizontal) plane. usage: class: elevator morph_move1 event_mask: stop: {master: } speed: angle: {key: } {slave: } elevator morph_move2 -------------------- description: A sector that moves horizontally. The player moves with the sector. IMPORTANT - each of the moving sector's walls, as well as any mirrors of those walls need to be given the flag 1 bit 32 (wall morph with sector). Otherwise, the sector would not move visually. Stop values are distances on the X-Z (horizontal) plane. usage: class: elevator morph_move2 event_mask: stop: {master: } speed: angle: {key: } {slave: } elevator morph_spin1 -------------------- description: A sector that spins around a point. The player doesn't spin with the sector. IMPORTANT - each of the spinning sector's walls, as well as any mirrors of those walls need to be given the flag 1 bit 32 (wall morph with sector). Otherwise, the sector would not spin visually. Stop values are angles in degrees. usage: class: elevator morph_spin1 event_mask: {stop: } {master: } speed: center: {key: } {slave: } elevator morph_spin2 -------------------- description: A sector that spins around a point. The player spins with the sector. IMPORTANT - each of the spinning sector's walls, as well as any mirrors of those walls need to be given the flag 1 bit 32 (wall morph with sector). Otherwise, the sector would not spin visually. Stop values are angles in degrees. usage: class: elevator morph_spin2 event_mask: {stop: } {master: } speed: center: {key: } {slave: } elevator rotate_wall -------------------- description: The walls of a sector with this elevator will rotate around the specified center. Stop values are angles in degrees. usage: class: elevator rotate_wall event_mask: {stop: } {master: } speed: center: {key: } {slave: } elevator door ------------- description: Normal door. Note, that it is easier to just use flag 1 bit 2 on a sector for a normal door. Elevator door is only really needed for a key door. Make sure that a sector with this elevator has the ceiling altitude of the door when it is OPEN!!! usage: class: elevator door {master: } {key: } elevator door_mid ----------------- description: A 2 part door (opens upwards and downwards). Information for the top and bottom parts are specified individually. "addon: 0" is the top part "addon: 1" is the bottom part The floor altitude of a sector with this elevator has to be the BOTTOM of the door. The ceiling altitude has to be the TOP of the door. The door will split halfway between. usage: class: elevator door_mid {master: } addon: 0 speed: {key: } addon: 1 speed: {key: } elevator basic -------------- description: floor that moves up and down. Stop values are the altitude of the floor. usage: class: elevator basic event_mask: stop: {master: } speed: {key: } {slave: } elevator inv ------------ description: ceiling that moves up and down. Often used for making doors. Stop values are the altitude of the ceiling. usage: class: elevator inv event_mask: stop: {master: } speed: {key: } {slave: } elevator move_ceiling --------------------- description: Ceiling that moves up and down. In fact, pretty much the same as elevator inv. Stop values are the altitude of the ceiling. usage: class: elevator move_ceiling event_mask: stop: {master: } speed: {key: } {slave: } elevator move_floor ------------------- description: floor that moves up and down. In fact, the same as elevator basic. Stop values are the altitude of the floor. usage: class: elevator move_floor event_mask: stop: {master: } speed: {key: } {slave: } elevator move_fc ---------------- description: Floor and ceiling that move up and down together. Stop values are the altitude of the floor. usage: class: elevator move_fc event_mask: stop: {master: } speed: {key: } {slave: } elevator scroll_ceiling ----------------------- description: ceiling texture scrolls Stop values are distances on the X-Z (horizontal) plane. usage: class: elevator scroll_ceiling event_mask: {stop: } {master: } speed: angle: {slave: } elevator scroll_floor --------------------- description: floor texture scrolls. Player moves with it. Useful for making conveyor belts, flowing water and flowing sewage. Remember, use a second altitude with water and sewage for better effect! Stop values are distances on the X-Z (horizontal) plane. usage: class: elevator scroll_floor event_mask: {stop: } {master: } speed: angle: {slave: } elevator scroll_wall -------------------- description: Wall texture scrolls. Useful for making waterfalls. Note that you apply this elevator to a whole sector, but make specific walls scroll by giving those walls flag 1 bit 64, 128, 256 or 512 in Levmap depending on whether you want the top, middle, bottom or sign texture to scroll. Walls without any of these flags will not scroll even if their sector is elevator scroll_wall. Stop values are distances on the Y (vertical) axis. usage: class: elevator scroll_wall event_mask: {stop: } {master: } speed: angle: {slave: } Just a couple more things - for several of the vertically moving elevators, it may be necessary to anchor wall textures to prevent unnatural texture movement. This can be done by setting the flag 1 value for a wall to 16 (wall tx anchored) or 4096 (sign anchored) in Levmap. An annoying thing is that it is not possible to anchor floor and ceiling textures to a morphing sector. This is what I suggest - for a moving sector, add a "class: elevator scroll_floor" and/or "class: elevator scroll_ceiling" with exactly the same stops, angle and speed as the "class: elevator morph_move1", and the floor and/or ceiling textures will move together with the sector. For spinning sectors, all you can do is add a single coloured texture so you can't see the texture movement. The best texture for this (used by LucasArs too!) is ZPGRYFIL.BM. 4. TRIGGERS ----------- Here are the triggers: ----------------------- | trigger standard | | trigger | | trigger switch1 | | trigger single | | trigger toggle | ----------------------- If you thought elevators were complicated, don't worry! Triggers are extremely simple because all trigger classes are almost identical! ALMOST! They are entered into the INF file as items in the same way as elevators with variables and information placed between the "seq" and "seqend", except that triggers can be applied to both sectors and walls: item: sector name: [sector name] seq seqend ** OR ** item: line name: [sector name] num: [wall number] seq seqend Here is a description of each trigger class and how to use it. The variables that are required by each class are shown. Any variables in {} are optional. Note that anything in square brackets - [] - must be replaced with appropriate values. All triggers can have unlimited clients. Note: If a specific message is not sent from a trigger to its client, then the client will just move to its next stop. IMPORTANT: Each time you add a trigger to the INF file, you must update the "items #" at the start of the INF file. trigger standard ---------------- description: This can be applied to a sector (entering, leaving or nudging it) or a line (crossing it or nudging it). usage: class: trigger standard event_mask: {entity_mask: } client: trigger ------- description: exactly the same as trigger standard as far as I know. usage: class: trigger event_mask: {entity_mask: } client: trigger switch1 --------------- description: this is used specifically for switch triggers. Remember, the wall containing the switch must have a sign which is a switch texture or the trigger will NOT operate. usage: class: trigger switch1 event_mask: {entity_mask: } client: trigger single -------------- description: this is a trigger that can only be used once. Can only be applied to lines - sectors will be able to be triggered more than once! usage: class: trigger single client: event_mask: {entity_mask: } trigger toggle -------------- description: this toggles an elevator between stops. Therefore, the client sector MUST have more than one stop. usage: class: trigger toggle event_mask: {entity_mask: } client: 5. TELEPORTER CHUTES -------------------- Teleporter chutes are a special third element of the INF file. They are not elevators or triggers. Their function is to teleport the player to another sector. NOTE: Dark Forces teleporter chutes do not have the same intention as the teleporters in DOOM. In DOOM, teleporters are deliberate and are just another fun aspect of a level. In Dark Forces, they are not intended to even be noticed. They are intended to make it look like the player has just fallen through a chute into a layer below, for example, in the Robotics Facility where you fall into the gas room, and Jabba's Ship where you fall into the area where you rescue Jan. These cases could only be accomplished through teleporter chutes because the other method (using a same sector in both layers) would mean making double adjoin/mirror/walks for the walls of that sector - something not possible. Consequently, you can only teleport straight down, so the target sector MUST be directly below the teleporter chute and must totally enclose the teleporter chute or it may be possible to teleport outside of a sector. It is also possible to teleport up, as in the demo, but this is never really necessary. IMPORTANT: Each time you add a teleporter chute to the INF file, you must update the "items #" at the start of the INF file. usage: item: sector name: [sector name] seq class: teleporter chute target: [target sector's name] seqend 6. MESSAGES ----------- Here are the messages: ------------------ | complete | | done | | goto_stop | | next_stop | | prev_stop | | master_on | | master_off | | m_trigger | | clear_bits | | set_bits | | wakeup | ------------------ A description of each message and its usage follows. Anything in [] has to be replaced appropriately. Note that for messages that are sent from triggers to elevators, the client of the trigger must first be specified (obviously). When messages are sent from an elevator, they are sent when it ARRIVES at a stop. Therefore, messages can't be sent from stop 0 unless the elevator is sent there after going to another stop. Messages are placed in the sequence of a trigger or an elevator (between the seq and seqend). complete -------- Description: tells an elevator that a trigger goal has been completed. The final num refers to the "TRIG: [num]" in the GOL file. The corresponding goal in your Personal Data Assistant (F1) will then be shown to be complete. For convenience, send this message to your completion elevator (the one with the "complete" stop). This message also sends its recipent elevator to its next stop. usage (trigger to elevator): message: complete [num] usage (elevator to elevator): message: [stop] [elevator name] complete [value] done ---- description: Sent from an elevator to a switch trigger. Tells the switch that it is ready to be used again (UNLESS it is a trigger single). usage: message: [stop] [sector name]([trigger line number]) done goto_stop --------- description: sent from a trigger to an elevator or an elevator to an elevator. Sends the elevator to a specified stop. usage (from trigger to elevator): message: goto_stop [stop number] usage (from elevator to elevator): message: [stop] [elevator name] goto_stop [stop number] next_stop --------- description: sent from a trigger to an elevator or an elevator to an elevator. Sends the elevator to its next stop. usage (trigger to elevator): message: next_stop usage (elevator to elevator): message: [stop] [elevator name] next_stop prev_stop --------- description: sent from a trigger to an elevator or an elevator to an elevator. Sends the elevator to its previous stop. usage (trigger to elevator): message: prev_stop usage (elevator to elevator): message: [stop] [elevator name] prev_stop master_on --------- description: sent from a trigger to an elevator or an elevator to an elevator. Turns the elevator's master on. usage (trigger to elevator): message: master_on usage (elevator to elevator): message: [stop] [elevator name] master_on master_off --------- description: sent from a trigger to an elevator or an elevator to an elevator. Turns the elevator's master off. usage (trigger to elevator): message: master_off usage (elevator to elevator): message: [stop] [elevator name] master_off m_trigger --------- description: when sent to a trigger, this message triggers it no matter what its event_mask is. Useful for triggering dummy trigger sectors that display messages from TEXT.MSG since "text" (see below) can only be sent when a trigger is triggered. usage: (trigger to sector) message: m_trigger usage: (elevator to sector) message: [stop] [sector name] m_trigger usage: (elevator to line) message: [stop] [sector name]([line number]) m_trigger clear_bits ---------- description: sent from a trigger to an sector or an elevator to a sector or wall. Clears specified flag bits. To clear more than one bits from a sector a wall, add the bit values up that you want cleared. usage (trigger to sector): message: clear_bits [flag number] [bit number] usage (elevator to sector): message: [stop] [sector name] clear_bits [flag number] [bit number] usage (elevator to line): message: [stop] [sector name]([line number]) clear_bits [flag number] [bit number] set_bits ---------- description: sent from a trigger to an sector or an elevator to a sector or wall. Sets specified flag bits. To set more than one flag to a sector or wall, add up the bit values that you want to be set. usage (trigger to sector): message: set_bits [flag number] [bit number] usage (elevator to sector): message: [stop] [sector name] set_bits [flag number] [bit number] usage (elevator to line): message: [stop] [sector name]([line number]) set_bits [flag number] [bit number] wakeup ------ description: sent from a trigger to a sector or an elevator to a sector. Wakes up objects in that sector. Useful for waking up generators and 3DO object animations (VUE file). usage (trigger to sector): message: wakeup usage (elevator to sector): message: [stop] [sector name] wakeup 7. OTHER STUFF -------------- Here are some other things that I have come across in INF files. Page ---- "Page" plays a sound effect when an elevator arrives at a stop. "Page" is placed in an elevator's sequence (between seq and seqend). Usage: page: [stop] [VOC file] Text ---- "Text" displays a text message from TEXT.MSG on the top of the screen. Add your own messages on the end of TEXT.MSG if you want! Messages are sent by triggers when they are triggered. "Text" is placed in a trigger's sequence. usage: text: [text number - see text.msg] Sound ----- "Sound" replaces the default sound effects of an elevator or switch trigger with another VOC file or silence. Most elevators have 3 sound effects - leaving a stop, moving between stops, and arriving at a stop. Switches only have one sound - when the switch is pressed. "Sound" is placed in an elevator's or switch trigger's sequence. usage (replacing a sound effect, elevators): sound: [sound value] [VOC file] usage (replacing a sound effect, triggers): sound: [VOC file] usage (replacing a sound effect with silence, elevators): sound: [sound value] 0 usage (replacing a sound effect with silence, triggers): sound: 0 Here are some good replacement sound effects: For value 1 (elevators, leaving a stop) DOOR1-1.VOC DOOR2-1.VOC DOOR3-1.VOC ELEV1-1.VOC ELEV2-1.VOC ELEV3-1.VOC For value 2 (elevators, moving between stops) DOOR1-2.VOC DOOR2-2.VOC DOOR3-2.VOC ELEV1-2.VOC ELEV2-2.VOC ELEV3-2.VOC ELECTRIC.VOC -- broken door, like in Talay For value 3 (elevators, arriving at a stop) DOOR1-3.VOC DOOR2-3.VOC DOOR3-3.VOC ELEV1-3.VOC ELEV2-3.VOC ELEV3-3.VOC For switches SWITCH1.VOC SWITCH2.VOC SWITCH3.VOC adjoin ------ "Adjoin" adjoins a line to another line when an elevator arrives at a stop. This is required if you need a line to remove its adjoin with one line and adjoin with another line midway through a level. "Adjoin" is placed in an elevator's sequence. For example, in level 6 (detention center), you may notice that the 2 main lifts have a door on each layer adjoined to it on the same line. Since a line cannot be adjoined to more than one other line at once, the following occurs: midway through moving up between 2 layers, the elevator move_floor arrives at a stop which it remains at for 0 seconds. At this stop, a line of the lift sector is adjoined to a line of the door sector on the layer above, at the same time removing its adjoin with a line of the door sector on the layer below. The lift's doors all appear to be directly on top of each other. usage: adjoin: [stop] [sector name] [line number] [sector name] [line number] Well, that's all folks! If you have anything to add to this file, if you want to correct something I have wrong, if you want to explain one of the unknown things to me or if you just want to comment or ask a question, mail me at kokj4m@stmichaels.vic.edu.au Any additions, corrections or explanations will be put in an updated version of this file. Include your name so that I can credit you. Please distribute this file like crazy! Upload it on bulletin boards, Internet pages, FTP sites, BBS sites etc! Until next time, Happy Dark Forces level making! h{V@@{%@@~MSWD ~}//{p{@ /vN{V{@ }/vN{V{@ }Microsoft Word letter{V@ /{ ?jvw`E > M N ' c !(!w!""a""#K###$4$k$l$%%R%%%%%%%%%%%%%&/&J&K&R&i&j&k&r&y&&&&&&' ' ''''''('q'( (9(:(A(V(W(X(\(`(m(n())))#)@)A)B)I)P)])^)))))))))))*A*********' c*****++(+K+n++++,,@,c,,,,--5-X-{--------....V.../2/~////0#0e0001 1 11%1;1s111112252T2z222223 3h334=4>4k4l4s4445535U5V5W5m5566e6667777R7w' c7w777788;8L8M8c8x89 9U999:::::D:i::::; ;-;.;/;E;Z;;=_====>>>>1>y>??`?|?}?????@@1@T@t@@@@@@AALAoApAAAAABB$BGBgBBBBBBBC3CuCCC' cCDDD D'DTDwDDDDDEEIEWEEEEFDFFFFFFGG<G]G}GGGGGGGGH"H#H*HXH}HHHHI!I"I#I1I>IIIIIIJJ<J_JJJJJJKKVKqKrKKKKKLL/LRLrLLLLLLM(M<M=MuMvMwMMMMNN9NYN{' cN{N|N}NNNNOOO!OQOvOOOOPPPP5PMPrPsPPPPQQ?QbQQQQQQQR>RRRSSSS$SYS~SSSTT$T%T&T;TPTTU0UzUVV#V$VeVfVnVVVW W+WKWmWnWoWWX?XXXYYgYYZ0ZzZZZZZZZZZ[[.[F' c[F[^[v[[[\\ \n\\\\]] ]!]0]1]B][]\]]]]]]]]]^L^M^^^^^__M_N_______`A`v`w`~```aa%a&a'a(a0a8a|a}aaaaab b!b"b#b$b4bDbbccc)cHcxccccccddMddddddee4e\e]e^' ce^e_e`eaepeeeefff5fZfffffffgghgpgqgrgxgygh hShhi&ijiij3j4j|jkkkUkgkhkikkkkl&l:ljllllllllllmm$m7mJm]mpmmmmmmmn1nInJnnnoocoooooooopJppq*qwqxqq' cqqqqrr3r4r5rSrtrrrrrssRsSsZscssssst t@tAtctltttttttuuuauuuuuuuuv'v(v)v3v=vvvvvwww$w%wWwXwYwcwmwwwxxx+x,xJxKx}x~xxxxyyy/y0yLyMykylyyyyyzzOzzz' czzz{ { {){*{Z{[{u{v{{{{{||d||||||} }!}=}>}}}}~~~~ ~~b~~~~"WXtu345<C+,DEabGM' ' a'o)*+XY%&_`qrsAMYeq})*7CO[\]dkMbcJ.xcfDE' c EE BK+$(.26=CIOsW?]cjq3v%{E&N%L   F C K2 IHb *7wCN{[Fe^qzEIJKLMNOPQRST P HH(FG(HH(d'@=/@H -:LaserWriter MonacoTimesEE   EKEK